package com.jk.util;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;

import org.apache.commons.lang.time.DateFormatUtils;
import org.apache.commons.lang.time.DateUtils;

public class DateUtil {

	public static final String[] yyyyMMdd = new String[]{"yyyy-MM-dd 00:00:00","yyyy-MM-dd 23:59:59"};
	
	public static final String[] yyyyMM = new String[]{"yyyy-MM"};
	
	public static final String fmt[] = new String[]{"yyyy-MM-dd HH:mm:ss"};
	
	
	private static Calendar cl = Calendar.getInstance();
	
	public static Date getMonthMaxDate(String month){
		try {
			cl.setTime(DateUtils.parseDate(month,yyyyMM));
		} catch (ParseException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		cl.set(Calendar.DAY_OF_MONTH, cl.getActualMaximum(Calendar.DAY_OF_MONTH));
		return cl.getTime();
	}
	
	public static Date getMonthMaxDate(String month,String[] parsePatterns){
		try {
			cl.setTime(DateUtils.parseDate(month,parsePatterns));
		} catch (ParseException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		cl.set(Calendar.DAY_OF_MONTH, cl.getActualMaximum(Calendar.DAY_OF_MONTH));
		return cl.getTime();
	}
	
	public static Date getMonthMinDate(String month){
		try {
			cl.setTime(DateUtils.parseDate(month,yyyyMM));
		} catch (ParseException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		cl.set(Calendar.DAY_OF_MONTH, cl.getActualMinimum(Calendar.DAY_OF_MONTH));
		return cl.getTime();
	}
	
	public static Date getMonthMinDate(String month,String[] parsePatterns){
		try {
			cl.setTime(DateUtils.parseDate(month,parsePatterns));
		} catch (ParseException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		cl.set(Calendar.DAY_OF_MONTH, cl.getActualMinimum(Calendar.DAY_OF_MONTH));
		return cl.getTime();
	}
	
	/**
	 * 
	 * @Description:比较两个时间点 如果secondDate表示的时间等于此 firstDate 表示的时间，则返回 0 值； 如果此
	 *                      firstDate 的时间在参数<secondDate>表示的时间之前，则返回小于 0 的值； 如果此
	 *                      firstDate 的时间在参数<secondDate>表示的时间之后，则返回大于 0 的值
	 * @param firstDate
	 * @param secondDate
	 * @ReturnType int
	 * @author:
	 * @Created 
	 */
	public static int compare(Date firstDate, Date secondDate) {

		Calendar firstCalendar = null;
		/** 使用给定的 Date 设置此 Calendar 的时间。 **/
		if (firstDate != null) {
			firstCalendar = Calendar.getInstance();
			firstCalendar.setTime(firstDate);
		}

		Calendar secondCalendar = null;
		/** 使用给定的 Date 设置此 Calendar 的时间。 **/
		if (firstDate != null) {
			secondCalendar = Calendar.getInstance();
			secondCalendar.setTime(secondDate);
		}

		try {
			/**
			 * 比较两个 Calendar 对象表示的时间值（从历元至现在的毫秒偏移量）。 如果参数表示的时间等于此 Calendar
			 * 表示的时间，则返回 0 值； 如果此 Calendar 的时间在参数表示的时间之前，则返回小于 0 的值； 如果此
			 * Calendar 的时间在参数表示的时间之后，则返回大于 0 的值
			 * **/
			return firstCalendar.compareTo(secondCalendar);
		} catch (NullPointerException e) {
			throw new IllegalArgumentException(e);
		} catch (IllegalArgumentException e) {
			throw new IllegalArgumentException(e);
		}
	}
	
	 /**
     * 取得某天所在周的第一天
     * @param year
     * @return
     */
    public static Date getFirstDayOfWeek(Date date) {
        Calendar c = new GregorianCalendar();
        c.setFirstDayOfWeek(Calendar.MONDAY);
        c.setTime(date);
        c.set(Calendar.DAY_OF_WEEK, c.getFirstDayOfWeek());
        return c.getTime();
    }
    
    /**
     * 取得某天所在周的最后一天
     * @param date
     * @return
     */
    public static Date getLastDayOfWeek(Date date) {
        Calendar c = new GregorianCalendar();
        c.setFirstDayOfWeek(Calendar.MONDAY);
        c.setTime(date);
        c.set(Calendar.DAY_OF_WEEK, c.getFirstDayOfWeek() + 6);
        return c.getTime();
    }
    
    /**
	 * 当前日期的上周一
	 */
	public static String lastMonday(){
		Calendar cal = Calendar.getInstance();
		//n为推迟的周数，1本周，-1向前推迟一周，2下周，依次类推
		int n = -1;
		String monday;
		cal.add(Calendar.DATE, n*7);
		//想周几，这里就传几Calendar.MONDAY（TUESDAY...）
		cal.set(Calendar.DAY_OF_WEEK,Calendar.MONDAY);
		monday = new SimpleDateFormat("yyyy-MM-dd 00:00:00").format(cal.getTime());
		return monday;
	}
	
    /**
     * 获取某个日期减去指定天数后的日期
     * @param d
     * @param day
     * @return
     */
    public static Date getDateBefore(Date d, int day) {      
        cl.setTime(d);      
        cl.set(Calendar.DATE, cl.get(Calendar.DATE) - day);      
        return cl.getTime();      
    }     
    /**
     * 获取某个日期加上指定天数后的日期
     * @param d
     * @param day
     * @return
     */
    public static Date getDateAfter(Date d, int day) {      
    	cl.setTime(d);      
    	cl.set(Calendar.DATE, cl.get(Calendar.DATE) + day);      
        return cl.getTime();      
    }    

    
    /**
     * 取得当前系统时间
     * @return
     */
    public static Date getCurrentDay(){
    	return cl.getTime();
    }
    
	/**
	 * 当前日期的上周日
	 */
	public static String  lastSunday(){
		Calendar cal = Calendar.getInstance();
		//n为推迟的周数，1本周，-1向前推迟一周，2下周，依次类推
		int n = 0;
		String sunday;
		cal.add(Calendar.DATE, n*7);
		//想周几，这里就传几Calendar.MONDAY（TUESDAY...）
		cal.set(Calendar.DAY_OF_WEEK,Calendar.SUNDAY);
		sunday = new SimpleDateFormat("yyyy-MM-dd 23:59:59").format(cal.getTime());
		return sunday;
	}
	
	/**
	 * 获取上个月月初时间
	 */
	public static String  lastMonthFirstDay(){
//      java 代码如何获取当前时间的上一个月的月末时间..
      Calendar cal = Calendar.getInstance();
//    设置天数为-1天，表示当月减一天即为上一个月的月末时间
      cal.add(Calendar.MONTH, -1);
      cal.set(Calendar.DAY_OF_MONTH, 1);
      //格式化输出年月
      SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd 00:00:00");
      return sdf.format(cal.getTime());
	}
	
	/**
	 * 获取上个月月末时间
	 */
	public static String  lastMonthLastDay(){
//      java 代码如何获取当前时间的上一个月的月末时间..
      Calendar cal = Calendar.getInstance();
//    设置天数为-1天，表示当月减一天即为上一个月的月末时间
      cal.set(Calendar.DAY_OF_MONTH, 1); 
      cal.add(Calendar.DATE, -1);
      //格式化输出年月
      SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd 23:59:59");
      return sdf.format(cal.getTime());
	}
	
	public static String  currentTimeOrderNo(){
		//String code = RandomUtil.generateString(6).toLowerCase();
		SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmsss");
		return sdf.format(new Date());
	}
	
	public static void main(String[] args){
		String curTime = "2015-12";
		try {
			cl.setTime(DateUtils.parseDate(curTime,yyyyMM));
			cl.set(Calendar.DAY_OF_MONTH, cl.getActualMinimum(Calendar.DAY_OF_MONTH));
			System.out.println(DateFormatUtils.format(cl.getTime(), "yyyy-MM-dd 00:00:00"));
		} catch (ParseException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}
